package JDBC;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Date;
import Servidor.Clases.Medida;
import Servidor.Clases.Sensor;

public class JDBCmedida implements JDBC{

	private static final String DRIVER_CLASS_NAME = "org.sqlite.JDBC";
	private static final String CONNECTION_URL = "jdbc:sqlite:resources/BBDD/trenes.s3db";
	//private static final String CONNECTION_URL = "jdbc:sqlite:C:/Users/Julen/Desktop/trenes.s3db";
	private Connection connection;
	private ResultSet resulset;
	
	public JDBCmedida(){
		try {
			Class.forName(DRIVER_CLASS_NAME);
			connection= DriverManager.getConnection(CONNECTION_URL);
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	
	public void close() throws SQLException{
		connection.close();
	}
	
	@Override
	public int insert(Object o) throws SQLException, ClassNotFoundException {
		if(o instanceof Medida){
			Statement statement = null;
			
			statement =  connection.createStatement();
			String sql="";
			Medida v=(Medida)o;
			sql= "INSERT INTO medida (id_sensor,date,latitud,longitud,valor) VALUES('"+v.getSensor().getId()+"',"+v.getFecha().getTime()+",'"+v.getLatitud()+"','"+v.getLongitud()+"',"+v.getValor()+");";
			int check=statement.executeUpdate(sql);
			statement.close();
			return check;
		}else
			throw new IllegalArgumentException("El parametro recibido debe ser de tipo Medida!");
	}
	
	@Override
	public int delete(Object o) throws SQLException {
		if(o instanceof Medida){
			Statement statement = null;
			statement =  connection.createStatement();
			String sql="";
			Medida v=(Medida)o;
			sql= "DELETE FROM medida WHERE date='"+v.getFecha().getTime()+"' AND id_sensor='"+v.getSensor().getId()+"';";
			int check=statement.executeUpdate(sql);
			statement.close();
			return check;}
		else
			throw new IllegalArgumentException("El parametro recibido debe ser de tipo Medida!");
	}

	@Override
	public ArrayList<Medida> selectAll() throws SQLException {
		Statement statement = null;
		statement =  connection.createStatement();
		String sql="";
		sql= "Select * FROM medida;";
		//ejecucion de sentencia sql
		resulset=statement.executeQuery(sql);
		//arrayList en el que se cargaran los resultados
		ArrayList<Medida> lista= new ArrayList<Medida>();
		
		//se recorren todas las entradas del result set
		while(resulset.next()){
			//a partir del resultset que representa cada linea extraida de la BBDD
			//se crea un objeto usuario que se carga en el array.
			lista.add(convertMedida(resulset));
		}
		
		statement.close();
		return lista;
	}
	
	public ArrayList<Medida> selectAllmedidas(Sensor s) throws SQLException {
		Statement statement = null;
		statement =  connection.createStatement();
		String sql="";
		sql= "Select * FROM medida where id_sensor="+s.getId()+";";
		//ejecucion de sentencia sql
		resulset=statement.executeQuery(sql);
		//arrayList en el que se cargaran los resultados
		ArrayList<Medida> lista= new ArrayList<Medida>();
		
		//se recorren todas las entradas del result set
		while(resulset.next()){
			//a partir del resultset que representa cada linea extraida de la BBDD
			//se crea un objeto usuario que se carga en el array.
			lista.add(convertMedida(resulset));
		}
		
		statement.close();
		return lista;
	}

	@Override
	public Medida selectOne(Object o) throws SQLException {
		//No se usa
		return null;
	}

	@Override
	public int update(Object o) throws SQLException, ClassNotFoundException {
		int check=delete(o);
		if(check!=0){
			insert(o);
		}
		return check;
	}
	
	private Medida convertMedida(ResultSet res) throws SQLException{
		JDBCsensor s= new JDBCsensor();
		Sensor sensor=s.selectOne(new Integer(res.getInt("id_sensor")));
		Medida Medida = new Medida(0,sensor);
		Medida.setValor(res.getInt("valor"));
		Medida.setFecha(new Date(res.getLong("date")));
		Medida.setLatitud(res.getString("longitud"));
		Medida.setLongitud(res.getString("latitud"));
		return Medida;
	}

}
